package com.hspedu.InnerClass;

/**
 * @Author Stringzhua
 * @Date 2024/3/6 16:26
 * description:
 */
public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        //创建对象
        Outer05 outer05 = new Outer05();
        outer05.f1();
        //外部其他类-->不能访问-->匿名内部类
        System.out.println("main outer05 hashCode= " + outer05);
    }
}

class Outer05 {
    private int n1 = 99;

    public void f1() {
        //创建一个基于类的匿名内部类
        //4.不能添加访问修饰符,因为它的地位就是一个局部变量
        //5.作用域:仅仅在定义它的方法或代码块中
        //6.匿名内部类-->访问-->外部类成员【访问方式:直接访问】
        //7.外部其他类-->不能访问-->匿名内部类 【原因:匿名内部类的地位是一个局部变量】
        //8.如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则
        //如果想访问外部类的成员,则可以使用 (外部类名.this.成员) 去访问
        Person p = new Person() {
            //8.如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则
            //如果想访问外部类的成员,则可以使用 (外部类名.this.成员) 去访问
            private int n1 = 88;//重名的话遵守就近原则

            //            如果想访问外部类的成员 -->外部类名.this.成员
            @Override
            public void hi() {
                //3.可以直接访问外部类的所有成员,包括私有的
                System.out.println("匿名内部类重写了 hi()方法 n1=" + n1);
                System.out.println("外部类的n1=" + Outer05.this.n1);
                //Outer05.this 就是调用f1的对象
                System.out.println("Outer05.this hashCode= " + Outer05.this);
            }
        };
        p.hi();//动态绑定,运行类型是outer05$1

        //也可以直接调用,匿名内部类本身是返回对象
        //class 匿名内部类 extends Person
//        new Person() {
//            @Override
//            public void hi() {
//                System.out.println("匿名内部类重写了 hi()方法,哈哈");
//            }
//
//            @Override
//            public void ok(String str) {
//                super.ok(str);
//            }
//        }.ok("jack");
    }
}

class Person {//类

    public void hi() {
        System.out.println("Person的 hi()方法");
    }

    public void ok(String str) {
        System.out.println("Person的 ok()方法" + str);
    }
}
//抽象类/接口
